K.I.A.Derouiche
Juillet 10, 2021 SICOM2021
Alger, Algerie
I - IPython, notebook, Jupyter
II - JupyterLab, pourquoi ?
III - Mon utilisation de Jupyter Lab (et Jupyter Notebook)

Créé par F Perez (chercheur au Berkeley Institute for Data Science) en 2001. Presque 20 ans !

On y trouve des petites surprises qui manquent à l'interpréteur python livré par défaut. En particulier, on a :
Avec complétation automatique et coloration syntaxique.
IPython affiche le résultat de la derniére expression évaluée si elle ne vaut pas None
Available line magics: %alias %alias_magic %autocall %autoindent %automagic %bookmark %cat %cd %clear %colors %config %cp %cpaste %debug %dhist %dirs %doctest_mode %ed %edit %env %gui %hist %history %killbgscripts %ldir %less %lf %lk %ll %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %ls %lsmagic %lx %macro %magic %man %matplotlib %mkdir %more %mv %notebook %page %paste %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %popd %pprint %precision %profile %prun %psearch %psource %pushd %pwd %pycat %pylab %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %rm %rmdir %run %save %sc %set_env %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode
Available cell magics: %%! %%HTML %%SVG %%bash %%capture %%debug %%file %%html %%javascript %%js %%latex %%markdown %%perl %%prun %%pypy %%python %%python2 %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile
Automagic is ON, % prefix IS NOT needed for line magics.
En lançant la commande IPython on travaille directement avec IPython, via stdin, stdout et stderr. Outer l'économie de ressources, cela permet de l'utiliser comme un shell systéme
# Mesurer le temps d'exécution
S = [x**2 for x in range(10)]
%timeit M = [x for x in S if x % 2 == 0]
891 ns ± 31.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
La commande shell commence par un point d'exclamation (!). Est la ligne est passé au shell du système
# avec la commande **!**
In [3]: ! du -h /etc
IPython propose une alternative commode à la commande help() de python avec la syntaxe ? On peut même consulter le code source (si présent) avec ??
import io
io.BytesIO?
Init signature: io.BytesIO(initial_bytes=b'') Docstring: Buffered I/O implementation using an in-memory bytes buffer. Type: type

Qu'entend-on par notebook ?
Premiére apparition du notebook dans le projet ipython (version 0.12, en 2009).
IPython Kernel supporte plus de 50 langage de programmation utiliser et mélanger dans une même interface: Python, R, JavaScript, Ruby, Perl, C, Julia, Fortran, Matlab ou Mathematica, SQLite et SQL... Il y en a pour tous les goûts !
IPython offre la possiblité aux objets Python de définir des représentations autres que le simple

En 2014, naissance du projet Jupyter : le notebook ne fait plus partie d'IPython. C'est là que l'outil s'est démocratisé : "La cellule".
En 2014, le projet ipython à été divsé en :
Cependant, la commande jupyter console:
plusieurs consoles Jupyter peuvent partager le meme noyau, En lançant la commande ipython on travaille directement avec IPython, via stdin, stdout et stderr.
Outre l'économie de ressources, cela permet de l'utiliser comme un shell système


Trois méthodes d'installations:
Jupyter Lab est développé pour remplacer, l'application web Jupyter Notebook. Il y a plusieurs motivations derrière ça.
2015 (?) : Début du développement.
Début 2018 : arrivée de JupyterLab en version bêta.
été 2019 : JupyterLab v1.0.0, première version stable.

Le développement a commencé en 2015 (environ, je ne suis pas aller chercher précisément).
En février 2018, JupyterLab est prêt à être utilisé en version bêta. (en lien, l'article de blog en faisant l'annonce.)
Il y a quelques mois, fin juin 2019, on a vu la version 1.0 de JupyterLab arriver. (en lien, la release github de la version 1.0 ; apparemment, ce n'était pas un accomplissement suffisant pour en faire une promo un peu plus grande ; je dois avouer que j'ai trouvé ça assez étonnant...). On en est à la version 1.2, une version 2.0 est prévue pour janvier.
(skip) (Il faut espérer qu'ils réussissent à mieux tenir les délais, dans la vidéo dans le premier lien, qui date d'août 2017, ils espèrent une bêta dans les mois qui viennent, et une version stable pour fin 2017...)
Démonstration
A quoi ressemble JupyterLab ?
Vous avez un menu en haut, un panneau latéral (qu'on peut déplier/replier) sur le côté, et un espace de travail, qui est modulable et qui peut contenir plusieurs onglets.
On a d'ailleurs deux kernels python, python 2 et python 3. Mais plus personne n'utilise python 2.
Regardons un peu plus en détail la barre de menu. J'avoue ne plus trop avoir besoin d'y faire un tour (parce que je connais les raccourcis usuels, qui sont bien pratiques et souvent bien trouvés).
Dans l'onglet File :
Dans l'onglet Edit, on trouve tout ce qui concerne l'édition de cellules :
Dans l'onglet View, on peut choisir des options visuelles, comme :
Dans l'onglet Run, on trouve tout ce qu'on veut pour lancer un noteook :
On peut aussi :
Dans ces cellules on peut saisir du texte aves des balises de lise en forme:
En cliquant sur la barre bleue à gauche, on peut réduire la taille de la cellule, et ça peut vraiment être pratique.
On peut le faire sur une cellule markdown, mais aussi sur l'entrée ou la sortie d'une cellule de code
Ca peut aussi être utile. Personnellement, je préfère ne pas avoir à toucher ma souris pour ça, et j'utilise plutôt les raccourcis claviers :
Il y avait déjà un onglet pour ça dans Jupyter Notebook, mais je trouve ça vraiment plus pratique ici (parce qu'on peut garder notre espace de travail sur le côté).
On a facilement accès à :
En conclusion, c'est super simple et pratique.
On pouvait déjà ajouter des extensions dans Jupyter Notebook
L'ajout d'extensions est encore plus au coeur de Jupyter Lab.
Fundamentally, JupyterLab is designed as an extensible environment.
Les extensions sont des paquets npm à installer.
Beaucoup aiment, ou même ont besoin, des extensions dans Jupyter notebook.
Sachez que l'ajout d'extensions est encore plus au coeur de Jupyter Lab, comme le prouve cette citation de la doc de Jupyter Lab (Fondamentallement, Jupyter Lab a été pensé en tant qu'environnement extensible). Apparemment, certaines parties de JL sont en fait de simples extensions, dans le sens où elles ne diffèrent pas des extensions non-officielles que n'importe qui ici peut proposer et ajouter.
Les extensions sont des paquets npm à installer (je mets là le lien vers npmjs, pour y trouver celles avec le label "jupyter-extension"). On y trouve un beau panaché de tout ce qui est possible.
Installation par ligne de commande
jupyter labextension install ...
pip install ... # potentiellement
jupyter serverextension enable --sys-prefix ... # potentiellement
L'installation d'une extension peut se faire en ligne de commande.
C'est indiqué dans les README des projets, mais, en général, ça se résume en un jupyter labextension install ... + un potentiel pip install ... et un jupyter serverextension enable --sys-prefix ....
Il existe aussi un manager d'extensions expérimental, qu'on peut mettre en route à partir des paramètres, dans la barre de menu (settings). Ce manager apparaît alors dans le panneau latéral.
Il nous donne accès aux extensions déjà installées, pour les désinstaller ou les désactiver.
Il y a aussi la possibilité de voir les commandes, et même de faire des recherches (ça peut être utile pour retrouver les raccourcis qu'on veut ; même si on ne peut pas faire une recherche sur le raccourci).
Le format ipynb est écrit en JSON

#Utilisation d'objet Python pour l'affichage
from IPython.display import Image
img = Image("images/logo_collage.png")
img
from IPython.display import Audio
song = Audio("./data/001_Debutant_CD1.mp3")
song
print(song._repr_html_()[:200])
<audio controls="controls" >
<source src="data:audio/mpeg;base64,SUQzAwAAAAAhdlRQRTIAAAAOAAAATWljaGVsIFRob21hc1RZRVIAAAAFAAAAMjAwN1RSQ0sAAAADAAAAMDFUUFVCAAAAHgAAAE
from IPython.display import YouTubeVideo
YouTubeVideo("8uWRVh58KdQ")
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0.1, 20, 200)
fig, axe = plt.subplots(figsize=(12, 8))
axe.plot(x, np.sin(x)/x)
[<matplotlib.lines.Line2D at 0x7f2c2e3ec470>]
l’utilisation de la librairie Pandas rend la lecture de certains formats, le regroupement de données et quelques traitements statistiques trés simples.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_excel('data/stock.xlsx')
df.dtypes
VIN object NUM ORDRE float64 CODE object MODEL object ETAT object ARRIVAGE object LOCALISATION object COULEUR object dtype: object
df.fillna(0)
| VIN | NUM ORDRE | CODE | MODEL | ETAT | ARRIVAGE | LOCALISATION | COULEUR | |
|---|---|---|---|---|---|---|---|---|
| 1 | Z226722 | 7090339.0 | 0A02 | R1200GS ADV | 0 | 0 | 0 | RACING RED MATT |
| 2 | Z721037 | 8430547.0 | 0J11 | R NINET PURE | PRODUIT | PROTOTYPE | 0 | GRIS ALUMINUM |
| 3 | Z735434 | 8430548.0 | 0J21 | R NINET RACER | 0 | PROTOTYPE | SHOW-ROOM | BLANC |
| 4 | Z594138 | 8430604.0 | 0B07 | F800GS | MANQUE BATTERIE | ARR 21 | SHOW-ROOM | NOIR |
| 5 | Z257806 | 8430665.0 | 0A03 | R1200RT | PRODUIT | ARR 21 | 0 | CARBON BLACK |
| 6 | Z623435 | 8430759.0 | 0A51 | R1200GS | PRODUIT | ARR 22 | SHOW-ROOM | BLANC |
| 7 | Z626789 | 8430815.0 | 0A51 | R1200GS MÜ | PRODUIT | ARR 14 | SHOW-ROOM | BLEU METT |
| 8 | Z629614 | 8430893.0 | 0A51 | R1200GS | PRODUIT | ARR 17 | SHOW-ROOM | NOIR |
| 9 | Z873235 | 8430614.0 | 0J41 | RNINE T URBAN G/S | EN COURS D'HOMOLOGATION | 0 | SHOW-ROOM | BLANC |
| 10 | Z635340 | 7089031.0 | 0A51 | R1200GS | PRODUCTION JUILLET | ARR 14 | 0 | ICED CHOCOLATE METALLIC |
| 11 | Z557450 | 7089001.0 | 0C04 | C650SPORT | PRODUCTION JUILLET | ARR 14 | CACHE | NOIR |
| 12 | Z557447 | 7089000.0 | 0C04 | C650SPORT | PRODUCTION JUILLET | ARR 14 | 0 | NOIR |
| 13 | Z557427 | 7089002.0 | 0C04 | C650SPORT | PRODUCTION JUILLET | ARR 14 | 0 | ORANGE |
| 14 | Z759338 | 7089033.0 | 0D52 | S1000R | 0 | ARR 14 | 0 | N0Y/CATALANO GREY |
| 15 | R834415 | 7090937.0 | 0G01 | G310R | PROD JUILLET | 0 | H/D | BLANC (///M) |
| 16 | R834646 | 8430470.0 | 0G01 | G310R | PROD JUILLET | 0 | 0 | BLANC (///M) |
| 17 | R834416 | 7090938.0 | 0G01 | G310R | PROD JUILLET | 0 | 0 | BLANC (///M) |
| 18 | 0 | 7089076.0 | 0A51 | R1200GS | PRODUCTION AOUT | 0 | 0 | N1S/ICED CHOCOLATE METAL |
| 19 | 0 | 0.0 | 0C05 | C650GT | PRODUCTION AOUT | 0 | 0 | N0M OCEAN BLEU METAL |
| 20 | Z638367 | 7089075.0 | 0A51 | R1200GS | PRODUCTION AOUT | ARR 13 | 0 | N1S/ICED CHOCOLATE METAL |
| 21 | R839794 | 7089037.0 | 0G01 | G310R | PROD JUILLET | ARR 13 | 0 | BLANC (///M) |
| 22 | R839793 | 7089038.0 | 0G01 | G310R | PROD JUILLET | ARR 13 | 0 | BLANC (///M) |
| 23 | Z927520 | 7089136.0 | 0A02 | R1200GS ADV | PRODUCTION SEPTEMBRE | ARR 15 | 0 | N1F/LIGHT WHITE/CORDOBA BLEU |
| 24 | Z639464 | 7089151.0 | 0A51 | R1200GS | PRODUCTION SEPTEMBRE | ARR 15 | 0 | BLEU METAL |
| 25 | Z639465 | 7089152.0 | 0A51 | R1200GS | PRODUCTION SEPTEMBRE | ARR 15 | 0 | BLEU METAL |
| 26 | Z639827 | 7089153.0 | 0A51 | R1200GS | PRODUCTION SEPTEMBRE | ARR 15 | 0 | NOIR ORAGE METAL |
| 27 | Z661918 | 7089149.0 | 0B55 | F800GS ADV | PRODUCTION SEPTEMBRE | ARR 15 | 0 | RACING BLUE METAL |
| 28 | Z557842 | 7089131.0 | 0C04 | C650SPORT | PRODUCTION SEPTEMBRE | ARR 15 | 0 | JAUNE METAL |
| 29 | Z557934 | 7089132.0 | 0C04 | C650SPORT | PRODUCTION SEPTEMBRE | ARR 15 | 0 | NOIR ORAGE METAL |
| 30 | Z558120 | 7089133.0 | 0C04 | C650SPORT | PRODUCTION SEPTEMBRE | ARR 15 | 0 | NOIR ORAGE METAL |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 84 | 0 | 7089781.0 | 0F02 | K1600GTL | PRODUCTION JANVIER | 0 | 0 | BLUE PLANET METALLIC/ALLU |
| 85 | 0 | 7089782.0 | 0F02 | K1600GTL | PRODUCTION JANVIER | 0 | 0 | BLANC |
| 86 | 0 | 7089783.0 | 0F02 | K1600GTL | PRODUCTION JANVIER | 0 | 0 | GRIS ECLAIR METAL |
| 87 | 0 | 7089784.0 | 0F02 | K1600GTL | PRODUCTION JANVIER | 0 | 0 | EBENE METAL |
| 88 | 0 | 7089921.0 | 0G02 | G310GS | PRODUCTION FEVRIER | 0 | 0 | N1D PEARL WHITE METALLIC |
| 89 | 0 | 7089922.0 | 0G02 | G310GS | PRODUCTION FEVRIER | 0 | 0 | N1D PEARL WHITE METALLIC |
| 90 | 0 | 7089923.0 | 0G02 | G310GS | PRODUCTION FEVRIER | 0 | 0 | N1D PEARL WHITE METALLIC |
| 91 | 0 | 7089924.0 | 0G02 | G310GS | PRODUCTION FEVRIER | 0 | 0 | N1D PEARL WHITE METALLIC |
| 92 | 0 | 7089925.0 | 0G02 | G310GS | PRODUCTION FEVRIER | 0 | 0 | N1D PEARL WHITE METALLIC |
| 93 | 0 | 7089926.0 | 0G02 | G310GS | PRODUCTION FEVRIER | 0 | 0 | N1D PEARL WHITE METALLIC |
| 94 | 0 | 7089927.0 | 0A02 | R1200GS ADV | PRODUCTION FEVRIER | 0 | 0 | LIGHT WHITE/CORDOBA BLUE |
| 95 | 0 | 7089928.0 | 0A02 | R1200GS ADV | PRODUCTION FEVRIER | 0 | 0 | LIGHT WHITE/CORDOBA BLUE |
| 96 | 0 | 7089929.0 | 0A51 | R1200GS | PRODUCTION FEVRIER | 0 | 0 | NOIR ORAGE METAL |
| 97 | 0 | 7089919.0 | 0C05 | C650GT | PRODUCTION FEVRIER | 0 | 0 | OCEAN BLUE MATT |
| 98 | 0 | 7089918.0 | 0C04 | C650SPORT | PRODUCTION FEVRIER | 0 | 0 | BLANC |
| 99 | 0 | 7089917.0 | 0C04 | C650SPORT | PRODUCTION FEVRIER | 0 | 0 | BLANC |
| 100 | 0 | 7089920.0 | 0D03 | S1000XR | PRODUCTION FEVRIER | 0 | 0 | RACING RED |
| 101 | 0 | 7089957.0 | 0G02 | G310GS | PRODUCTION FEVRIER | 0 | 0 | NA5 ROUGE RACING |
| 102 | 0 | 7089958.0 | 0G02 | G310GS | PRODUCTION FEVRIER | 0 | 0 | NA5 ROUGE RACING |
| 103 | 0 | 7089959.0 | 0G02 | G310GS | PRODUCTION FEVRIER | 0 | 0 | NA5 ROUGE RACING |
| 104 | 0 | 7089960.0 | 0G02 | G310GS | PRODUCTION FEVRIER | 0 | 0 | COSMIC BLACK |
| 105 | 0 | 7089961.0 | 0G02 | G310GS | PRODUCTION FEVRIER | 0 | 0 | COSMIC BLACK |
| 106 | 0 | 7089962.0 | 0G02 | G310GS | PRODUCTION FEVRIER | 0 | 0 | COSMIC BLACK |
| 107 | 0 | 7089963.0 | 0G02 | G310GS | PRODUCTION FEVRIER | 0 | 0 | COSMIC BLACK |
| 108 | 0 | 7089964.0 | 0G02 | G310GS | PRODUCTION FEVRIER | 0 | 0 | COSMIC BLACK |
| 109 | 0 | 7089965.0 | 0G02 | G310GS | PRODUCTION FEVRIER | 0 | 0 | N1D PEARL WHITE METALLIC |
| 110 | 0 | 7089966.0 | 0G02 | G310GS | PRODUCTION FEVRIER | 0 | 0 | N1D PEARL WHITE METALLIC |
| 111 | 0 | 7089967.0 | 0G02 | G310GS | PRODUCTION FEVRIER | 0 | 0 | N1D PEARL WHITE METALLIC |
| 112 | 0 | 7089968.0 | 0G02 | G310GS | PRODUCTION FEVRIER | 0 | 0 | N1D PEARL WHITE METALLIC |
| 113 | 0 | 7089969.0 | 0G02 | G310GS | PRODUCTION FEVRIER | 0 | 0 | N1D PEARL WHITE METALLIC |
113 rows × 8 columns
%matplotlib inline
data = pd.read_csv("./example/hubble_data.csv")
data.head()
| distance | recession_velocity | |
|---|---|---|
| 0 | 0.032 | 170 |
| 1 | 0.034 | 290 |
| 2 | 0.214 | -130 |
| 3 | 0.263 | -70 |
| 4 | 0.275 | -185 |
data.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 24 entries, 0 to 23 Data columns (total 2 columns): distance 24 non-null float64 recession_velocity 24 non-null int64 dtypes: float64(1), int64(1) memory usage: 464.0 bytes
headers = ["dist","rec_vel"]
data_no_headers = pd.read_csv("./example/hubble_data_no_headers.csv", names = headers)
data_no_headers.head()
| dist | rec_vel | |
|---|---|---|
| 0 | 0.032 | 170 |
| 1 | 0.034 | 290 |
| 2 | 0.214 | -130 |
| 3 | 0.263 | -70 |
| 4 | 0.275 | -185 |
Selectionné d'une colonne
data_no_headers["dist"].tail(4)
20 2.0 21 2.0 22 2.0 23 2.0 Name: dist, dtype: float64
Jouer avec les index
data.set_index("distance", inplace= True)
data.head()
| recession_velocity | |
|---|---|
| distance | |
| 0.032 | 170 |
| 0.034 | 290 |
| 0.214 | -130 |
| 0.263 | -70 |
| 0.275 | -185 |
data.plot()
plt.show()
from sympy import *
# Initialize notebook printing
init_printing()
integrate(x**2 * exp(x) * cos(x), x)
IPywidgets : pour rajouter des boutons, des cases à cocher, ...
\$ pip install ipywidgets
\$ jupyter nbextension enable --py --sys-prefix widgetsnbextension
Les IPywidgets sont des éléments graphiques permettant de piloter des paramétres de fonctions
La clé réside dans le module interact
### Premier exemple
from ipywidgets import interact
from ipywidgets import *
from IPython.display import display
w = IntSlider()
display(w, w)
interact(f, x='text')
<function __main__.f(x)>
### Deuxième exemple
def f(x):
print(x)
interact(f, x=10)
<function __main__.f(x)>
### valeur booléen
interact(f, x=True) #Or False
<function __main__.f(x)>
import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import interact
t = np.arange(0.0, 1.0, 0.01)
x = np.linspace(0, 2*np.pi, 100)
def pltsin(f):
plt.plot(x, np.sin(2*np.pi*t*f))
plt.show()
interact(pltsin, f=(1, 10, 0.1))
t
array([0. , 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ,
0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2 , 0.21,
0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.3 , 0.31, 0.32,
0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4 , 0.41, 0.42, 0.43,
0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.5 , 0.51, 0.52, 0.53, 0.54,
0.55, 0.56, 0.57, 0.58, 0.59, 0.6 , 0.61, 0.62, 0.63, 0.64, 0.65,
0.66, 0.67, 0.68, 0.69, 0.7 , 0.71, 0.72, 0.73, 0.74, 0.75, 0.76,
0.77, 0.78, 0.79, 0.8 , 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87,
0.88, 0.89, 0.9 , 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98,
0.99])
L'outil nbconvert est un outil en ligne de commandes qui permet de convertir les fichiers .ipynb dans un des formats supportés: HTML, PDF via LaTeX, diapositives(reveal.js), script, markdown, ReStructured Text.
jupyter nbconvert --to pdf votre_fichier.ipynb
jupyter nbconvert --to html --template base votre_fichier.ipynb
jupyter nbconvert slides.ipynb --to slides --post serve --ServePostProcessor.reveal_cdn="http://cdn.jsdelivr.net/reveal.js/2.5.0"

Avec d'autres utilisateurs de jupyter:
Je vais m'arrêter là dessus, mais il y aurait encore beaucoup de choses à dire. Parmi les choses que je n'ai pas encore vraiment pris le temps d'essayer, mais que j'avais envie de citer, il y a :